package com.cnpc.netty.transfer;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpSender {

    public static String udpip;
    public static int udpport;

    public UdpSender(String ip, int port) {
        udpip = ip;
        udpport= port;
    }

    //波长模式
    //指令说明：该指令用来读取所有通道的波长数据。每个通道固定 30 组频率数据，并且每个通道最后都有管壳温度数据。下发指令后，设备开始循环扫描。
    //注：设备扫描速度一般为缺省值。频率数据/10=频率（GHz）
    public void start(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "30 02 06 00 00 00";
            System.out.println("UdpSender start() message: " + message);
            byte[] data ={0x30,0x02,0x06,0x00,0x00,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //调试模式
    //指令说明：下发该指令后，主机只运行一个周期，同时获取所有通道的波长和光谱数据。
    //波长数据：与波长模式下的数据格式一摸一样。
    //光谱数据：AD 步长影响光谱数据的长度。在 AD 步长为 1GHz 情况下，一个通道就有
    //5101 个 AD 数据。但是一般默认 AD 步长为 2，故数据量缩 减为 2551 个。
    //100Hz 设备 AD 值与光功率计算公式：
    //P(dBm) = 10log 𝐴𝐷 ∗ 𝑋
    //3Hz 设备 AD 值与光功率计算公式：
    //P(dBm) = AD ∗ 2.03463 × 10−3 − 60
    public void start1(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "30 03 06 00 00 00";
            System.out.println("UdpSender start1() message: " + message);
            byte[] data ={0x30,0x03,0x06,0x00,0x00,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //光谱模式（该功能仅部分设备支持）
    //指令说明：进入该工作模式后，主机循环扫描，将所有通道的 AD 数据上传。
    //注：光谱模式下 AD 步长为 20。
    public void start2(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "30 04 06 00 00 00";
            System.out.println("UdpSender start2() message: " + message);
            byte[] data ={0x30,0x04,0x06,0x00,0x00,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //单通道光谱模式
    //指令说明：查询设备某一通道的光谱数据和当前增益模式。AD 数据受 AD 步长影响。当
    //AD 步长为 2 时，AD 数据为 2551 个。
    public void start3(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "30 07 06 00 00 00";
            System.out.println("UdpSender start3() message: " + message);
            byte[] data ={0x30,0x07,0x06,0x00,0x00,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //停止扫描指令
    //指令说明：在任意的工作模式启动后，需要停止当前工作模式时，下发该指令。
    public void stop(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "30 01 06 00 00 00";
            System.out.println("UdpSender stop() message: " + message);
            byte[] data ={0x30,0x01,0x06,0x00,0x00,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询版本号
    //指令说明：查询主机固件的版本号
    //版本号=（256*256*256* 0x X1 +256*256*0x X2 +256* 0xX3 + 0x X4）/100；
    public void queryVersion(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "10 01 04 00";
            System.out.println("UdpSender queryVersion() message: " + message);
            byte[] data ={0x10,0x01,0x04,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询序列号
    //指令说明：查询主机的 SN 序列号。
    //序列号=256*256*256*0x X1 + 256*256*0x X2 + 256*0x X3 + 0x X4；
    public void querySN(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "10 03 04 00";
            System.out.println("UdpSender querySN() message: " + message);
            byte[] data ={0x10,0x03,0x04,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询主机硬件参数
    //指令说明：查询设备的扫描速度，通道数，每个通道支持的光栅个数与寻峰间隔
    //通道数=256*0x X3 +0x X4；
    //光栅个数=256*0x X5 +0x X6；缺省为 30
    //最小光栅间隔=256*0x X7 +0x X8；缺省值为 40GH
    public void queryHardware(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "10 04 04 00";
            System.out.println("UdpSender queryHardware() message: " + message);
            byte[] data ={0x10,0x04,0x04,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询主机扫描参数
    //指令说明：查询主机的扫描起点，终点，扫描步长，AD 步长。
    //起点位置=0xX1 *256 +0xX2 起点位置=196251-起点频率；
    //扫描步长=0xX3 *256 +0xX4 默认 2GHz；
    //终点位置=0xX5 *256 +0xX6 终点位置=196251-终点频率；
    //AD 步长 =0xX7 *256 +0xX8 默认 2GHz；
    public void queryScanParam(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "10 05 04 00";
            System.out.println("UdpSender queryScanParam() message: " + message);
            byte[] data ={0x10,0x05,0x04,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询主机通道配置
    //指令说明：查询主机每个通道的阈值，增益。
    //阈值=0x X1 *256 +0x X2 缺省值为 65535（该值情况下自动计算并设置阈值）
    public void queryHostChannelConfig(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "10 06 04 00";
            System.out.println("UdpSender queryHostChannelConfig() message: " + message);
            byte[] data ={0x10,0x06,0x04,0x00};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //设置扫描参数
    //指令说明：设置主机的扫描起点，终点，扫描步长，AD 步长
    //起点位置=0xX1 *256 +0xX2 起点位置=196251-起点频率，默认 196250；
    //扫描步长=0xX3 *256 +0xX4 默认 2GHz；（不建议修改，修改前请咨询技术人员）
    //终点位置=0xX5 *256 +0xX6 终点位置=196251-终点频率，默认 191150；
    //AD 步长=0xX7 *256 +0xX8 默认 2GHz；（修改后影响光谱的数据采集量）
    public void setScanParam(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "20 01 0C 00 01 00 02 13 ED 00 02";
            System.out.println("UdpSender setScanParam() message: " + message);
            byte[] data ={0x20,0x01,0x0C,0x00,0x01,0x00,0x02,0x13, (byte) 0xED,0x00,0x02};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //设置寻峰阈值
    //指令说明：设置主机的寻峰阈值。需根据实际的噪声本底情况进行设置。
    //通道号=0x X1 (指定具体通道，0x00 为通道 1)
    //阈 值=256* 0x X2 + 0x X3 (阈值范围 0-16383，其中 65535 为自动计算阈值)
    public void setPeakSeeking(){
        try (DatagramSocket socket = new DatagramSocket()) {
            // 目标服务器地址和端口
            InetAddress address = InetAddress.getByName(udpip);
            // 要发送的数据
            String message = "20 02 06 02 04 B0";
            System.out.println("UdpSender setPeakSeeking() message: " + message);
            byte[] data ={0x20,0x02,0x06,0x02,0x04, (byte) 0xB0};
            // 创建数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, address, udpport);
            // 发送数据包
            socket.send(packet);
            System.out.println("数据包已发送！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}